package com.lzh.shijicloudstack.service;


import com.baomidou.mybatisplus.extension.service.IService;
import com.lzh.shijicloudstack.common.R;
import com.lzh.shijicloudstack.model.dto.user.*;
import com.lzh.shijicloudstack.model.entity.User;
import com.lzh.shijicloudstack.model.vo.user.LoginUserVo;

import javax.servlet.http.HttpServletRequest;
import java.util.List;
import java.util.Map;

/**
 * 用户表(User)表服务接口
 *
 * @author luzhiheng
 * @since 2022-09-26 16:50:18
 */
public interface UserService extends IService<User> {

    /**
     * 登录
     *
     * @param dto
     * @return
     */
    R<Map<String, Object>> login(LoginUserDto dto);

    /**
     * 获取注册验证码
     *
     * @param email 邮箱
     * @return
     */
    R<Object> getEmailCode(String email);

    /**
     * 用户注册
     *
     * @param dto
     * @return
     */
    R regist(UserRegisterDto dto);

    /**
     * 退出登录
     *
     * @return
     */
    R logout();

    /**
     * 根据用户id获取用户
     *
     * @param userId
     * @return
     */
    User getUserById(Long userId);

    /**
     * 更新用户头像
     *
     * @param userId
     * @param avatar
     * @return
     */
    R<Object> updateUserAvatar(Long userId, String avatar);

    /**
     * 更新用户密码
     *
     * @param dto
     * @return
     */
    R updateUserPassword(UpdateUserPasswordDto dto);

    /**
     * 重置密码
     *
     * @param email       邮箱
     * @param newPassword 新密码
     * @param conPassword 确认密码
     * @return
     */
    R rePassword(String email, String newPassword, String conPassword);

    /**
     * 注销账号
     *
     * @param userId 用户id
     * @return
     */
    R<Object> cancelAccount(Long userId);

    User getUserByUserName(String userName);

    String getUserNameByUserId(Long createBy);

    List<User> listUserByName(String name);

    /**
     * 获取登录用户信息
     *
     * @param request
     * @return
     */
    LoginUserVo getLoginUser(HttpServletRequest request);

    /**
     * @param user
     * @return
     */
    LoginUserVo getLoginUserVo(User user);

    /**
     * @param updatePwdDto 修改密码
     * @return R<Boolean>
     */
    R<?> updatePasswordByUserId(UpdatePwdDto updatePwdDto);

    /**
     * 分页查询用户列表
     *
     * @param dto 参数
     * @return Map<String, Object>
     */
    Map<String, Object> pageList(UserPageDto dto);

    /**
     * 删除用户
     *
     * @return R<Boolean>
     */
    R<Boolean> delete(Long id);
}

